/**
 * Definition for a binary tree node.
 * function TreeNode(val) {
 *     this.val = val;
 *     this.left = this.right = null;
 * }
 */

/**
 * Encodes a tree to a single string.
 *
 * @param {TreeNode} root
 * @return {string}
 */
var serialize = function (root) {
  let list = [] // 生成一个数组用来储存这个字符串的每个字符
  function mySerialize (root) { // 传入一个根节点
    if (root === null) {
      list.push('#') // 如果是空就放入# 然后返回
      return
    }
    list.push(root.val) // 如果不是空就放入这个的值
    mySerialize(root.left)
    mySerialize(root.right) // 递归处理左右子树
  }
  mySerialize(root)
  return list.join(',') // 拼接成字符串
};

/**
 * Decodes your encoded data to tree.
 *
 * @param {string} data
 * @return {TreeNode}
 */
var deserialize = function (data) {
  let nodes = data.split(',') // 先把字符串转换成这个节点
  function myDeserialize (nodes) {
    // 接受一个节点列表
    if (nodes.length === 0) {
      return null // 如果这个没有了就返回null
    }
    let first = nodes.shift() // 第一个就是 头结点
    if (first === '#') return null // 如果第一个是#那就返回null
    let root = new TreeNode(first) // 生成根节点
    root.left = myDeserialize(nodes)
    root.right = myDeserialize(nodes) // 递归处理左右的节点
    return root
  }
  return myDeserialize(nodes) // 借用辅助函数来完成这个转化
};

/**
 * Your functions will be called as such:
 * deserialize(serialize(root));
 */